/**
 * @file authservice.h
 * @brief 用户认证服务类头文件 - 处理所有用户认证相关的业务逻辑
 *
 * AuthService是应用程序的认证管理核心，提供：
 * - 用户注册、登录、登出功能
 * - JWT令牌管理和自动刷新
 * - 密码重置和找回功能
 * - 用户信息的本地存储和管理
 * - 认证状态的实时监控
 */

#ifndef AUTHSERVICE_H
#define AUTHSERVICE_H

#include <QObject>          // Qt对象基类
#include <QJsonObject>      // JSON对象处理
#include <QSettings>        // 本地设置存储
#include "apiclient.h"

/**
 * @class AuthService
 * @brief 用户认证服务类
 *
 * 封装所有用户认证相关的业务逻辑，提供完整的用户管理功能。
 * 通过ApiClient与后端认证服务器通信，处理用户的整个认证生命周期。
 */
class AuthService : public QObject
{
    Q_OBJECT  // 启用Qt元对象系统

public:
    /**
     * @struct UserInfo
     * @brief 用户信息数据结构
     *
     * 存储从服务器获取的完整用户信息，包括基本信息、状态和权限。
     * 这个结构体会被序列化为JSON保存到本地，也会从JSON反序列化。
     */
    struct UserInfo {
        int userId = 0;                 ///< 用户唯一ID
        QString username;               ///< 用户名
        QString email;                  ///< 邮箱地址
        QString lastLogin;              ///< 最后登录时间（ISO 8601格式）
        QString status;                 ///< 用户状态（active、inactive、banned等）
        int loginCount = 0;             ///< 登录次数统计
        QString createdAt;              ///< 账户创建时间（ISO 8601格式）
        QString role;                   ///< 用户角色（user、admin、moderator等）
        bool emailVerified = false;     ///< 邮箱是否已验证
        QStringList permissions;        ///< 用户权限列表
    };

    explicit AuthService(QObject *parent = nullptr);

    // 认证操作
    void registerUser(const QString &username, const QString &password, const QString &email);
    void login(const QString &username, const QString &password, bool rememberMe = false);
    void logout(bool allDevices = false);
    void validateToken();
    void refreshToken();
    void forgotPassword(const QString &email);
    void resetPassword(const QString &token, const QString &newPassword);

    // 状态查询
    bool isAuthenticated() const;
    UserInfo getCurrentUser() const;
    QString getToken() const;

    // API客户端访问（用于与其他服务共享认证令牌）
    ApiClient* getApiClient() const;

signals:
    void loginSucceeded(const UserInfo &userInfo);
    void loginFailed(const QString &error);
    void registerSucceeded();
    void registerFailed(const QString &error);
    void logoutCompleted();
    void tokenValidated(const UserInfo &userInfo);
    void tokenExpired();
    void authenticationRequired();
    void forgotPasswordSucceeded();
    void forgotPasswordFailed(const QString &error);
    void resetPasswordSucceeded();
    void resetPasswordFailed(const QString &error);

private slots:
    void onApiResponse(const QString &endpoint, const ApiClient::ApiResponse &response);
    void onAuthenticationRequired();
    void onTokenRefreshed(const QString &newToken);

private:
    ApiClient *m_apiClient;
    UserInfo m_currentUser;
    QString m_pendingOperation;

    void saveUserInfo(const QJsonObject &userInfo);
    void clearUserInfo();
    UserInfo parseUserInfo(const QJsonObject &data) const;
    void handleLoginResponse(const ApiClient::ApiResponse &response);
    void handleRegisterResponse(const ApiClient::ApiResponse &response);
    void handleLogoutResponse(const ApiClient::ApiResponse &response);
    void handleValidateResponse(const ApiClient::ApiResponse &response);
    void handleForgotPasswordResponse(const ApiClient::ApiResponse &response);
    void handleResetPasswordResponse(const ApiClient::ApiResponse &response);
};

#endif // AUTHSERVICE_H
